package com.spark.concurrency.other;

import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 复制写List，并发安全且性能比Vector好，
 */
public class CopyOnWriteArrayListTest {
    private static final CopyOnWriteArrayList<String> arrayList = new CopyOnWriteArrayList<>();

    public static void main(String[] args) throws InterruptedException {
        arrayList.add("hello");
        arrayList.add("alibaba");
        arrayList.add("to");
        arrayList.add("hangzhou");

        Thread thread = new Thread(() -> {
            arrayList.set(1, "baba"); //——修改元素
            arrayList.remove(1); //——删除元素
            arrayList.remove(2);
        });
        Iterator<String> iterator = arrayList.iterator(); //——保证在修改线程启动前获取迭代器
        thread.start(); //——启动线程
        thread.join(); //——等待子线程执行完毕
        while (iterator.hasNext()) { //——迭代元素
            System.out.println(iterator.next());
        }
    }
}

        /*
        输出结果
        hello
        alibaba
        to
        hangzhou
        如上代码中，main函数首先初始化了arrayList，然后再启动线程前获取到了arrayList迭代器。子线程thread启动后首先修改了arrayList的第一个元素的值，然后删除了arrayList对应下标的元素。
        主线程在子线程执行完毕后使用获取的迭代器遍历数组元素，从结果可知，子线程的操作一个都没有生效，这就是迭代器的弱一致性的体现。
        需要注意的是，获取迭代器的操作需要在子线程操作之前进行。
*/
